package com.yugao.fintech.antelope.system.model.rqrs.menu;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.yugao.fintech.antelope.system.constants.MenuCons;
import com.yugao.fintech.framework.assistant.utils.tree.TreeNode;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.io.Serializable;
import java.util.List;


@Getter
@Setter
@ToString
public class MenuTreeResp implements TreeNode<Long, MenuTreeResp>, Serializable {
    private Long id;

    /**
     * 上一级树的id
     */
    private Long parentId;

    /**
     * 菜单标识, 用于一些业务场景处理
     */
    private String code;

    /**
     * 树的名称
     */
    protected String name;

    /**
     * 前端数据树中的key
     */
    private String key;

    /**
     * 前端数据树中的value
     */
    private String value;

    /**
     * 前端数据树中的title
     */
    private String title;

    /**
     * 若父节点无其他子节点，则该父节点是叶子节点
     */
    private Boolean isLeaf;

    /**
     * 请求地址
     */
    private String url;

    @NotBlank(message = "排序编号")
    private Integer sortNum;

    /**
     * 路由地址
     */
    @Size(min = 0, max = 200, message = "路由地址不能超过200个字符")
    private String path;

    /**
     * 组件路径
     */
    @Size(min = 0, max = 200, message = "组件路径不能超过255个字符")
    private String component;

    /**
     * 是否缓存（0缓存 1不缓存)
     */
    private String isCache;

    /**
     * @see MenuCons.Type
     */
    private String menuType;
    private String menuTypeText;

    /**
     * 菜单状态
     */
    private String status;

    /**
     * 是否为外链
     */
    private Boolean external;

    /**
     * 菜单权限编码，例如：“sys:schedule:list,sys:schedule:info”,多个逗号隔开
     */
    @Size(min = 0, max = 100, message = "权限标识长度不能超过100个字符")
    private String perms;

    /**
     * 权限策略1显示2禁用
     */
    private String permsType;

    /** 菜单图标 */
    private String icon;

    /**
     * 是否隐藏路由菜单: 0否,1是（默认值0）
     */
    private Boolean hideMenu;

    /**
     * 是否隐藏tab
     */
    private Boolean hideTab;

    /**
     * 是否路由菜单
     */
    private Boolean route;


    protected String slotTitle;

    /**
     * 一级菜单跳转地址
     */
    private String redirect;

    /**
     * 菜单的拷贝id, 被拷贝和拷贝的id一样
     */
    private Long copyId;

    /**
     * 是否在主框架外打开
     */
    private Boolean isMainOut;

    /**
     * 是否配置菜单的数据权限 1是, 0否 默认0
     */
    protected Integer ruleFlag;

    /**
     * 是否为聚合路由 (聚合路由的情况下允许使用子菜单路径作为父菜单的路由地址)
     */
    private Boolean alwaysShow;

    /** 子节点 */
    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    protected List<MenuTreeResp> children;

    public MenuTreeResp() {
    }

    public String getKey() {
        return String.valueOf(this.id);
    }

    public String getTitle() {
        return this.name;
    }

    @Override
    public Long treeId() {
        return this.id;
    }

    @Override
    public void treeId(Long id) {
        this.id = id;
    }

    @Override
    public Long treeParentId() {
        return this.parentId;
    }

    @Override
    public void treeParentId(Long parentId) {
        this.parentId = parentId;
    }

    @Override
    public List<MenuTreeResp> children() {
        return this.children;
    }

    @Override
    public String name() {
        return this.name;
    }

    /**
     * 子菜单, 由于Antd table, 在树形的table中，如果数据结构中的children的值是[ ]，没有值，table还是会显示展开按钮
     * 因此这里需要判断children是否为空数组, 如果为空就设置为null
     */
    @Override
    public void children(List<MenuTreeResp> children) {
        if (children != null && children.isEmpty()) {
            return;
        }
        this.children = children;
    }

    @Override
    public Integer sortNo() {
        return this.sortNum;
    }
}
